Completed
Pull Request — develop (#123)
by Xaver
01:08
created

router.js ➔ ... ➔ gotoLink   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
c 1
b 0
f 0
nc 2
dl 0
loc 7
rs 9.4285
nop 2
1
define(['Navigo'], function (Navigo) {
2
  'use strict';
3
4
  return function (config, language) {
5
    var init = false;
6
    var objects = { nodes: {}, links: {} };
7
    var targets = [];
8
    var views = {};
9
    var current = {};
10
    var state = { language: _.locale(), view: 'map' };
11
12
    function resetView() {
13
      targets.forEach(function (t) {
14
        t.resetView();
15
      });
16
    }
17
18
    function gotoNode(d, update) {
19
      if (d.nodeId in objects.nodes) {
20
        targets.forEach(function (t) {
21
          t.gotoNode(objects.nodes[d.nodeId], update);
22
        });
23
      }
24
    }
25
26
    function gotoLink(d, update) {
27
      if (d.linkId in objects.links) {
28
        targets.forEach(function (t) {
29
          t.gotoLink(objects.links[d.linkId], update);
30
        });
31
      }
32
    }
33
34
    function view(d) {
35
      if (d.view in views) {
36
        views[d.view]();
37
        state.view = d.view;
38
        resetView();
39
      }
40
    }
41
42
    function customRoute(lang, viewValue, node, link, zoom, lat, lng) {
43
      console.log(lang, viewValue, node, link, zoom, lat, lng);
0 ignored issues
show
Debugging Code introduced by
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
44
      current = {
45
        lang: lang,
46
        view: viewValue,
47
        node: node,
48
        link: link,
49
        zoom: zoom,
50
        lat: lat,
51
        lng: lng
52
      };
53
54
      if (lang && _.locale() !== lang) {
55
        language.setLocale(lang);
56
      }
57
58
      if (!init) {
59
        if (viewValue) {
60
          state.view = viewValue;
61
        }
62
        view({ view: state.view });
63
        init = true;
64
      }
65
66
      if (viewValue && state.view !== viewValue) {
67
        view({ view: viewValue });
68
      }
69
70
      if (node) {
71
        gotoNode({ nodeId: node });
72
      } else if (link) {
73
        gotoLink({ linkId: link });
74
      } else if (lat) {
75
        targets.forEach(function (t) {
76
          t.gotoLocation({
77
            zoom: parseInt(zoom, 10),
78
            lat: parseFloat(lat),
79
            lng: parseFloat(lng)
80
          });
81
        });
82
      } else {
83
        resetView();
84
      }
85
    }
86
87
    var root = null;
88
    var useHash = true;
89
    const router = new Navigo(root, useHash);
90
91
    router
92
      .on(/^\/?#?\/([\w]{2})?\/?(map|graph)?\/?([a-f\d]{12})?([a-f\d\-]{25})?\/?(?:(\d+)\/([\d.]+)\/([\d.]+))?$/, customRoute)
93
      .on({
94
        '*': function () {
95
          router.fullUrl();
96
        }
97
      });
98
99
    router.generateLink = function generateLink(data, full, deep, navigate) {
100
      var result = '';
101
102
      if (full) {
103
        data = Object.assign({}, state, data);
104
      } else if (deep) {
105
        data = Object.assign({}, current, data);
106
      }
107
108
      if (data) {
109
        for (var key in data) {
110
          if (!data.hasOwnProperty(key)) {
111
            continue;
112
          }
113
          if (data[key] !== undefined) {
114
            result += '/' + data[key];
115
          }
116
        }
117
      }
118
119
      return useHash && !navigate ? '#' + result : result;
120
    };
121
122
    router.fullUrl = function fullUrl(data, e) {
123
      if (e) {
124
        e.preventDefault();
125
      }
126
      router.navigate(router.generateLink(data, true, true));
127
    };
128
129
    router.gotoLocation = function gotoLocation(d) {
130
      if (!d) {
131
        return false;
132
      }
133
134
      targets.forEach(function (t) {
135
        if (!t.gotoLocation) {
136
          console.warn('has no gotoLocation', t);
137
        }
138
        t.gotoLocation(d);
139
      });
140
141
      return true;
142
    };
143
144
    router.reset = function reset() {
145
      resetView();
146
    };
147
148
    router.addTarget = function addTarget(d) {
149
      targets.push(d);
150
    };
151
152
    router.removeTarget = function removeTarget(d) {
153
      targets = targets.filter(function (e) {
154
        return d !== e;
155
      });
156
    };
157
158
    router.addView = function addView(k, d) {
159
      views[k] = d;
160
    };
161
162
    router.setData = function setData(data) {
163
      objects.nodes = {};
164
      objects.links = {};
165
166
      data.nodes.all.forEach(function (d) {
167
        objects.nodes[d.nodeinfo.node_id] = d;
168
      });
169
170
      data.graph.links.forEach(function (d) {
171
        objects.links[d.id] = d;
172
      });
173
    };
174
175
    return router;
176
  };
177
});
178